﻿# 最后修改日期：2020/1/27 16:30

from wmath import *
from math import pi
import matplotlib.pyplot as plt

# 设置左右区间、以及多项式的项数
# 系数为0的也算作一项，所以n为最高项次数+1
l = -pi
r = pi
n = 6

# 创建系数为1的多项式，即幂函数
vs = []
print("\n多项式：\n")
for i in range(n):
    # 构造系数list
    print([int((x+1)/(i+1)) for x in range(i+1)])
    # 构造多项式
    v = Polynomial([int((x+1)/(i+1)) for x in range(i+1)])
    print(str(v), "\n")
    vs.append(v)
'''
效果与上面代码相同
v1 = Polynomial([1])
v2 = Polynomial([0,1])
v3 = Polynomial([0,0,1])
vs = [v1, v2, v3]
'''

# 求解规范正交基，作为基向量
es = gsp(vs, l, r)
print("\n正交基：\n")
for e in es:
    print(str(e))

# 求解最佳近似解
# 目标函数 x*sin(x)
print("\n投影长度：\n")
ks = [0.0 for x in range(n)]
for i in range(n):
    # 求出目标函数 与 各个基向量 的内积
    dot = 0
    for j in range(i+1):
        # 求多项式每一项 与 sinx的内积
        dot += integral_poly_sin(1*es[i].ks[j],1+j,l,r)
    # 求出目标函数 在该基向量的 投影
    k = dot / es[i].norm(l,r)
    print(k)
    # 累加各个投影
    for j in range(len(es[i].ks)):
        ks[j] += k * es[i].ks[j]

# 构造近似函数
print("\n最佳近似解：\n")
sim = Polynomial(ks)
print(str(sim))

#-----------------------------------------------------------
# 绘制图像

d = 100
# x数列
xs = [x/d - 3 for x in range(6*d+1)]
# 目标函数
t = [x*sin(x) for x in xs]
# 近似函数
y = [sim.f(x) for x in xs]

plt.plot(xs, t, color="b")
plt.plot(xs, y, color="g")

plt.show()
